题目:给定一个字符串str,返回str的统计字符串。如”aaabbadddffc”的统计字符串为:”a_3_b_2_a_1_d_3_f_2_c_1”。
题目补充:给定字符串的统计字符串cstr,再给定一个整数index,返回cstr所代表的的原始字符串上的第index个字符。如”a_1_b_100”所代表的原始字符串的第0个字符为a,第50个字符为b。
实现:
- 如果str为空,则统计字符串不存在
- 如果str不为空。首先生成StringBuffer类型的对象rst,表示统计字符串;生成整型变量num,代表当前字符的数量。初始状态rst=str[0],且num=1。
- 遍历字符串str,如果str[i]==str[i-1],则num++;如果str[i]!=str[i-1],则说明前面相同字符str[i-1]已经统计完,令rst=rst.append(rst + ‘_‘ + num + _ + str[i]),重置num=1。然后依次遍历下去。
- 当遍历到最后一个字符,发现最后一个字符已经放入,但其个数还未放入,最后令rst=rst+’_‘+num。
我用的StringBuffer生成统计字符串,避免产生多个String
问题2实现:
- 给定的统计字符串如cstr=”a_3_b_2_a_1_d_3_f_2_c_1”,其中有三种字符,字母、下划线和数字。定义stage,stage=true表示遇到的是字符,当遇到”-“,stage=!stage,为false,表示该转向数字阶段了。
- 字符变量cur,表示上次遇到的连续字符;整型变量num表示上一个遇到连续字符的时候,字符出现的次数;整型变量sum表示遍历到目前位置相当于在原字符串的什么位置。
- 初始化stage=true,cur=0(字符编码为0表示空字符串),num=0,sum=0。
- 当遇到一个新的字符,即stage=true时,sum+=num,代表前面已经有多少个字符了,若index>sum,说明还没遍历到原字符串的index位置的字符;若index已到达,则返回上一个字符。
- 最后需要将最后一个字符的num加到sum上。
1 | public class GetCountStr { |
1 | /** |
1 | //Test |
输出:
1 | a_3_b_2_a_1_d_3_f_2_c_1 |